#pragma once

namespace Alice
{

/*
    三维向量
*/
class Vec3
{
public:
    Vec3() : x(0.0f), y(0.0f), z(0.0) {}
    Vec3(float x, float y, float z) : x(x), y(y), z(0.0) {}

    /*
        重载基本数学运算符
    */
    Vec3 operator+(Vec3 const& v) const
    {
        return Vec3(x + v.x, y + v.y, z + v.z);
    }

    Vec3 operator+=(Vec3 const& v)
    {
        x += v.x;
        y += v.y;
        z += v.z;

        return *this;
    }

    Vec3 operator-(Vec3 const& v) const
    {
        return Vec3(x - v.x, y - v.y, z - v.z);
    }

    Vec3 operator-=(Vec3 const& v)
    {
        x -= v.x;
        y -= v.y;
        z -= v.z;

        return *this;
    }

    Vec3 operator*(Vec3 const& v) const
    {
        return Vec3(x * v.x, y * v.y, z * v.z);
    }

    Vec3 operator*=(Vec3 const& v)
    {
        x *= v.x;
        y *= v.y;
        z *= v.z;

        return *this;
    }

    Vec3 operator*(float scalar) const
    {
        return Vec3(x * scalar, y * scalar, z * scalar);
    }

    Vec3 operator*=(float scalar)
    {
        x *= scalar;
        y *= scalar;
        z *= scalar;

        return *this;
    }

    float x, y, z;
};

} // namespace Alice
